package com.woniu.controller;

import cn.dev33.satoken.util.SaResult;
import com.woniu.annotation.OperateLog;
import com.woniu.entity.SysLoginLog;
import com.woniu.service.SysLoginLogService;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * @Description 登录日志控制器
 * 处理与登录日志相关的HTTP请求
 * 所有接口需要登录验证，使用@SaCheckLogin注解
 * @Author pml
 * @Date 2025/6/18 22:57
 */
@RestController
@RequestMapping("sysLoginLog")
public class SysLoginLogController {

    /**
     * 注入Service而非直接注入Mapper，符合分层架构
     * Controller层只处理HTTP请求和响应，不包含业务逻辑
     */
    @Resource
    private SysLoginLogService sysLoginLogService;

    /**
     * 添加登录日志
     * 登录操作完成后自动调用此接口记录日志
     * 创建时间设为当前时间，创建人默认为system
     * @param sysLoginLog 登录日志信息
     * @return 操作结果
     */
    @PostMapping("/add")
    public SaResult add(@RequestBody SysLoginLog sysLoginLog) {
        sysLoginLog.setCreateTime(LocalDateTime.now());
        sysLoginLog.setCreator("system"); // 系统自动创建的日志，创建人固定为system
        return SaResult.ok().setData(sysLoginLogService.save(sysLoginLog));
    }

    /**
     * 删除登录日志
     * 提供按ID删除单条日志的功能
     * 实际业务中日志通常不删除，此处保留接口用于特殊情况
     * @param id 日志ID
     * @return 操作结果
     */
    @DeleteMapping("/delete/{id}")
    public SaResult delete(@PathVariable Integer id) {
        return SaResult.ok().setData(sysLoginLogService.removeById(id));
    }

    /**
     * 修改登录日志
     * 日志通常不需要修改，此接口用于特殊情况（如补充备注信息）
     * 更新时自动设置更新时间
     * @param sysLoginLog 登录日志信息
     * @return 操作结果
     */
    @PutMapping("/update")
    public SaResult update(@RequestBody SysLoginLog sysLoginLog) {
        sysLoginLog.setUpdateTime(LocalDateTime.now());
        return SaResult.ok().setData(sysLoginLogService.updateById(sysLoginLog));
    }

    /**
     * 根据ID查询登录日志
     * 用于查看单条日志的详细信息
     * @param id 日志ID
     * @return 日志详情
     */
    @GetMapping("/get/{id}")
    public SaResult getById(@PathVariable Integer id) {
        return SaResult.ok().setData(sysLoginLogService.getById(id));
    }

    /**
     * 查询所有登录日志
     * 添加操作日志注解，记录管理员的查询行为
     * @return 日志列表
     */
//    @OperateLog(module = "loginLog", operateType = "query", content = "查询所有登录日志列表")
    @GetMapping("/list")
    public SaResult list() {
        return SaResult.ok().setData(sysLoginLogService.list());
    }

    /**
     * 根据用户ID查询登录日志
     * 业务中常用功能，便于管理员查看特定用户的登录历史
     * @param userId 用户ID
     * @return 该用户的登录日志列表
     */
    @GetMapping("/listByUserId/{userId}")
    public SaResult listByUserId(@PathVariable Integer userId) {
        List<SysLoginLog> logs = sysLoginLogService.listByUserId(userId);
        return SaResult.ok().setData(logs);
    }

    /**
     * 清理过期日志
     * 提供按天数清理历史日志的功能，防止表数据过大
     * 添加操作日志注解，记录此敏感操作
     * @param days 保留最近天数
     * @return 清理结果
     */
    @OperateLog(module = "loginLog", operateType = "delete", content = "清理过期登录日志")
    @DeleteMapping("/cleanExpiredLogs/{days}")
    public SaResult cleanExpiredLogs(@PathVariable int days) {
        int count = sysLoginLogService.cleanExpiredLogs(days);
        return SaResult.ok().setMsg("成功清理" + count + "条过期日志");
    }
}